// 利用多线程模拟多个用户抢票
// 使用全局锁

#include <iostream>
#include <unistd.h>
#include <thread>

using namespace std;

int tickets = 10000;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 定义一个全局锁,会自动初始化

void *threadRoutine(void *name)
{
    string tname = static_cast<const char *>(name);

    while (true)
    {
        pthread_mutex_lock(&mutex); // 所有的线程都需要先上锁才能再访问资源
        if (tickets > 0)
        {
            usleep(2000); // 模拟抢票花费的时间
            cout << tname << "get a ticket:" << tickets-- << endl;
            pthread_mutex_unlock(&mutex);
        }
        else
        {
            pthread_mutex_unlock(&mutex);
            break;
        }
        // pthread_mutex_unlock(&mutex);//解锁不能放在这里，如果票数<0执行break会漏掉解锁
        usleep(1000); // 抢完票的后续动作
    }
    return nullptr;
}

int main()
{
    pthread_t t[4]; // 4个线程
    int n = sizeof(t) / sizeof(t[0]);

    for (int i = 0; i < n; i++)
    {
        char *data = new char[64];
        snprintf(data, 64, "thread-%d ", i + 1);
        pthread_create(t + i, nullptr, threadRoutine, data);
    }

    for (int i = 0; i < n; i++)
    {
        pthread_join(t[i], nullptr);
    }
    return 0;
}